有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java hibernate一对多出错,外键错误

我有两张桌子,订单和订单。他们之间的关系是一对多的。订购商品。fk_orders是外键。命令。ID是主键

我首先保存订单,然后保存订单项,但保存订单项。fk_订单与订单不同。ID和订单项。fk_顺序值很长(例如“3213148”,但正常值为“425618”),该问题只是偶尔出现

Orders.hbm.xml as below:
....
 <id name="id" column="ID" type="java.lang.Long">
            <generator class="native">
            </generator>
 </id>

<set name="orderProduct" lazy="false" cascade="all"
             sort="unsorted">

            <key column="FK_ORDERS"></key>

            <one-to-many
                    class="com.arvato.ecommerce.model.base.OrderItems"/>

</set>
....



OrderItem.hbm.xml as below:
....
 <id name="id" column="ID" type="java.lang.Long">
            <generator class="native">
            </generator>
 </id>
<many-to-one name="orders"
                     class="com.arvato.ecommerce.model.base.Orders" cascade="none"
                     outer-join="auto" update="true" insert="true" lazy="false"
                     column="FK_ORDERS"/>
....




The code as below:
//save order
Orders orders = new Orders();
....
....

orders.setOrderItems(null);//(I think it is strange I don't know why set the null value to OrderItems?)


session = getSession();
session.save(object);
session.flush()


//save order items
....
Collection orderItems = orders.getOrderItems();
if (orderItems != null) {
                OrderItem orderItem;
                for (Iterator itemIterator = orderItems.iterator(); itemIterator.hasNext(); orderdao.insertOrderProduct(orderItem)) {
                    orderItem = (OrderItem) itemIterator.next();
                    orderItem.setOrders(orders);

                }
            }

....



public int insertOrderProduct(OrderItem orderItem)
            throws DaoException {
            Session session =null;
        try {

            session = getSession();
            session.save(orderItem);

            session.flush();


            return 1;
        } catch (Exception e) {
            e.printStackTrace();

            return 0;
        }
    }

共 (1) 个答案

  1. # 1 楼答案

    您的映射似乎是正确的,但您使用它的方式是错误的。 由于您使用cascade="all",因此Orders实例中列出的所有OrderItems将在保存Orders实例时自动持久化

    下面的代码应该足够了:

    Orders orders = new Orders();
    orders.addItem(new OrderItem());
    ...
    
    session = getSession();
    session.save(object);
    session.flush()
    

    其中addItem方法如下所示:

    public void addItem(OrderItem item) {
        if (items == null) {
            items = new ArrayList<OrderItem>();
        }
        item.setOrders(this);
        items.add(item);
    }